# @Filename:    Iteration
# @Author:      王佳伟
# @Time:        2025-04-01 15:03
# @Describe:    数组上的迭代
import numpy as np

# NumPy 包包含一个迭代器对象numpy.nditer。
# 它是一个有效的多维迭代器对象，可以用于在数组上进行迭代。
# 数组的每个元素可使用 Python 的标准Iterator接口来访问。

# a = np.arange(0, 60, 5)
# a = a.reshape(3, 4)
# print('原始数组是：')
# print(a)
# print('\n')
# print('修改后的数组是：')
# for x in np.nditer(a):
#     print(x)
#
# print('=====================')
#
# # 迭代的顺序匹配数组的内容布局，而不考虑特定的排序。 这可以通过迭代上述数组的转置来看到。
# a = np.arange(0, 60, 5)
# a = a.reshape(3, 4)
# print('原始数组是：')
# print(a)
# print('\n')
# print('原始数组的转置是：')
# b = a.T
# print(b)
# print('\n')
# print('修改后的数组是：')
# for x in np.nditer(b):
#     print(x)
#
# print('=====================')
#
# # 迭代顺序
# # 如果相同元素使用 F 风格顺序存储，则迭代器选择以更有效的方式对数组进行迭代。
# a = np.arange(0, 60, 5)
# a = a.reshape(3, 4)
# print('原始数组是：')
# print(a)
# print('\n')
# print('原始数组的转置是：')
# b = a.T
# print(b)
# print('\n')
# print('以C风格顺序排序：')
# c = b.copy(order='C')
# print(c)
# for x in np.nditer(c):
#     print(x,)
# print('\n')
# print('以F风格顺序排序：')
# c = b.copy(order='F')
# print(c)
# for x in np.nditer(c):
#     print(x,)

# 可以通过显式提醒，来强制nditer对象使用某种顺序：
a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是：')
print(a)
print('\n')
print('以C风格顺序排序：')
for x in np.nditer(a, order='C'):
    print(x)
print('\n')
print('以F风格顺序排序：')
for x in np.nditer(a, order='F'):
    print(x)

print("======================================")

# nditer对象有另一个可选参数op_flags。
# 其默认值为只读，但可以设置为读写或只写模式。 这将允许使用此迭代器修改数组元素。

a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是：')
print(a)
print('\n')
for x in np.nditer(a, op_flags=['readwrite']):
    x[...] = 2 * x
print('修改后的数组是：')
print(a)

print("======================================")

# 外部循环

# 在下面的示例中，迭代器遍历对应于每列的一维数组。

a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是：')
print(a)
print('\n')
print('修改后的数组是：')
for x in np.nditer(a, flags = ['external_loop'], order = 'F'):
    print(x)

print("======================================")

# 广播迭代
# 如果两个数组是可广播的，nditer组合对象能够同时迭代它们。
# 假设数组a具有维度 3X4，并且存在维度为 1X4 的另一个数组b，则使用以下类型的迭代器（数组b被广播到a的大小）。

a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是：')
print(a)
print('\n')
print('第二个数组：')
b = np.array([1, 2, 3, 4], dtype = int)
print(b)
print('\n')
print('修改后的数组是：')
for x,y in np.nditer([a, b]):
    print('%d:%d'%(x,y))

